package arithmetic;

import org.junit.jupiter.api.Test;

/**
 * 实现 string indexOf
 *
 * @author gaojie
 * @date 2022-03-10
 */
public class StringIndexOf {

    @Test
    void test() {
        assert fun("", "") == 0;
        assert fun("abc", "a") == 0;
        assert fun("hello", "ll") == 2;
        assert fun("hello", "all") == -1;
    }

    /**
     * 1.若 childes 为空，直接返回 0
     * 2.将字符串都转换为数组
     * 3.循环 parents
     * 将当前元素与 childes 第一个元素比较，若相同则继续往下比较，若 childes 循环完后都是相同，则返回当前下标
     * 若没有被返回，则默认返回 -1
     */
    int fun(String haystack, String needle) {

        // 1.若子串为空，返回0
        int cl = needle.length();
        if (cl == 0) return 0;

        // 2.字符串转换为数组
        char[] childChars = needle.toCharArray();
        char[] parentChars = haystack.toCharArray();

        // 3.循环判断
        int pl = parentChars.length;
        for (int i = 0; i < pl - cl + 1; i++) {
            // 3.1.若第一个元素相同，则继续判断
            if (parentChars[i] == childChars[0]) {
                // 3.2.若只有一个元素，则表示匹配成功，返回
                if (cl == 1) return i;
                // 3.3.多元素情况，遍历匹配后面的元素
                for (int j = 1; j < cl; j++) {
                    // 3.4.若出现不匹配的，则跳出当前循环
                    if (parentChars[i + j] != childChars[j]) break;
                    // 3.5.若全部相同，则表示匹配成功，返回
                    if (j == cl - 1) return i;
                }
            }
        }

        // 4.若没有匹配到，则返回 -1
        return -1;
    }
}
